// ts 编译es5
let str: string = '你好'

// 数据类型
//布尔 boolean
let isDone: boolean = false

//数字类型 number
let nums2: number = 12

//字符串类型 string
let str2: string = '你好'

//数组类型 array
// 第一种定义数组的方式
let arr: number[] = [1, 2, 3]
// 第二种定义数组的方式 泛型
let arr2: Array<number> = [1, 2, 3]
// 第三种
let arr3: any[] = [22, 33, 44, 'nihao', '44']

//元组类型 tuple 属于数组的一种（可以指定数组里每一个元素的类型）
let arr4: [string, number, boolean] = ['你好', 2, false]

//枚举类型 enum 主要用于标识状态或者固定值
// status 0 未支付 1 支付 2 交易成功
enum Flag {
  success = 1,
  error = -1,
}
let f: Flag = Flag.success

enum Color {
  red,
  yellow,
  blue,
}
console.log(Color.red) //0

// 默认没有值 会以上一个值自增一
enum Color2 {
  red,
  yellow = 3,
  blue,
} //0 3 4
//任意类型 any

let num: any = 123
num = '123'

// null undefined   其他类型的子类型
// 一个数据可以被定义为多种类型
let num2: number | null | undefined

// void 表示没有任何类型，一般用于定义方法的时候没有返回值

// es5写法
// function run (){
//   console.log('run');
// }
// run()

//正确写法
function run(): void {
  console.log('111')
}
run()

// 正确写法
function nums(): number {
  return 123
}

// never 是其他类型（包括null和 undefined）的子类型，代表从不会出现的值，
// 这意味着声明never的变量只能被never类型赋值

let a: undefined
//a=23 //报错
a = undefined //可以
//a=null //报错

var b: never
//b =123 //报错

let myFavoriteNumber: string | number
myFavoriteNumber = 'seven'
console.log(myFavoriteNumber.length) // 5
myFavoriteNumber = 7
//console.log(myFavoriteNumber.length); // 编译时报错

// 类型断言

// 尖括号 语法（与react中的jsx语法冲突）
let someValue = 'this'
let strlength: number = (<string>someValue).length
console.log(strlength) //4

// as语法（推荐使用）
let someValue2 = 'is'
let strlength2: number = (someValue2 as string).length
console.log(strlength) //4

let flags2: null | undefined | string
